#include "textrun.h"

#include <QTextStream>

TextRun::TextRun(QString *url)
{
    this->url = *url;
}

void TextRun::Go()
{
    connect(&parser, SIGNAL(countFinished()), this, SLOT(outputResults()));
    parser.setUrl(this->url);
    parser.getPage();
}

void TextRun::outputResults()
{
    QTextStream out(stdout);

    if (parser.getReply()->error() != QNetworkReply::NoError)
    {
        out<<parser.getReply()->errorString() + "\n";
        out.flush();
        emit done();
        return;
    }

    QMap <QString, int> count(parser.getCount());
        QRegExp rxOchan("0chan");

        if (rxOchan.indexIn(url) != -1)
                count.insert("firefox", count.value("firefox") - 3);

    int sumOs = count.value("linux") + count.value("windows") + count.value("macos");
    int sumBr = count.value("firefox") + count.value("opera") + count.value("chrome");


    if ((sumOs + sumBr) == 0)
    {
        out<<tr("Никто не соснул");
        emit done();
        return;
    }

    out<<tr("\n-----Отсос-репорт-----\n");

    int linuxpercent = 0;
    int windowspercent = 0;
    int macospercent = 0;

    const int pb_width = 25; // ширина текстового прогресс-бара в символах

    if (sumOs)
    {
        linuxpercent = 100 * count.value("linux") / sumOs;
        windowspercent = 100 * count.value("windows") / sumOs;
        macospercent = 100 * count.value("macos") / sumOs;
    }

    out<<tr("\nOS-бляди:");

    if ( m_PbMode ) // текстовые прогресс-бары
    {
        out <<  tr("\nПрыщебляди:\t") + PbString(pb_width, linuxpercent) + " " + QString::number(linuxpercent).rightJustified(3, ' ', false)
              + tr("%  (отсосов: ") + QString::number(count.value("linux")) + tr(" из ")
              + QString::number(sumOs) + ")";

        out <<  tr("\nСпермобляди:\t") + PbString(pb_width, windowspercent) + " " + QString::number(windowspercent).rightJustified(3, ' ', false)
              + tr("%  (отсосов: ") + QString::number(count.value("windows")) + tr(" из ")
              + QString::number(sumOs) + ")";

        out <<  tr("\nГовноеды:\t") + PbString(pb_width, macospercent) + " " + QString::number(macospercent).rightJustified(3, ' ', false)
              + tr("%  (отсосов: ") + QString::number(count.value("macos")) + tr(" из ")
              + QString::number(sumOs) + ")";
    }
    else // просто текст
    {
	out<<tr("\nПрыщебляди:\t") + QString::number(linuxpercent) + tr("%\t(отсосов: ") +
            QString::number(count.value("linux")) + tr(" из ") + QString::number(sumOs) + ")";
	out<<tr("\nСпермобляди:\t") + QString::number(windowspercent) + tr("%\t(отсосов: ") +
            QString::number(count.value("windows")) + tr(" из ") + QString::number(sumOs) + ")";
	out<<tr("\nГовноеды:\t") + QString::number(macospercent) + tr("%\t(отсосов: ") +
            QString::number(count.value("macos")) + tr(" из ") + QString::number(sumOs) + ")";
    }


    out<<tr("\n\nБразуеробляди:");

    int firefoxpercent = 0;
    int operapercent = 0;
    int chromepercent = 0;

    if (sumBr)
    {
        firefoxpercent = 100 * count.value("firefox") / sumBr;
        operapercent = 100 * count.value("opera") / sumBr;
        chromepercent = 100 * count.value("chrome") / sumBr;
    }
    if ( m_PbMode ) // текстовые прогресс-бары
    {
        out <<  tr("\nЛисоёбы:\t") + PbString(pb_width, firefoxpercent) + " " + QString::number(firefoxpercent).rightJustified(3, ' ', false)
              + tr("%  (отсосов: ") + QString::number(count.value("firefox")) + tr(" из ")
              + QString::number(sumBr) + ")";

        out <<  tr("\nОперасты:\t") + PbString(pb_width, operapercent) + " " + QString::number(operapercent).rightJustified(3, ' ', false)
              + tr("%  (отсосов: ") + QString::number(count.value("opera")) + tr(" из ")
              + QString::number(sumBr) + ")";

        out <<  tr("\nХромичи:\t") + PbString(pb_width, chromepercent) + " " + QString::number(chromepercent).rightJustified(3, ' ', false)
              + tr("%  (отсосов: ") + QString::number(count.value("chrome")) + tr(" из ")
              + QString::number(sumBr) + ")";
    }
    else  // просто текст
    {
	out<<tr("\nЛисоёбы:\t") + QString::number(firefoxpercent) + tr("%\t(отсосов: ") +
            QString::number(count.value("firefox")) + tr(" из ") + QString::number(sumBr) + ")";
	out<<tr("\nОперасты:\t") + QString::number(operapercent) + tr("%\t(отсосов: ") +
            QString::number(count.value("opera")) + tr(" из ") + QString::number(sumBr) + ")";
	out<<tr("\nХромичи:\t") + QString::number(chromepercent) + tr("%\t(отсосов: ") +
            QString::number(count.value("chrome")) + tr(" из ") + QString::number(sumBr) + ")";
    }

    out<<tr("\n\nПетушков задетектировано: ") + QString::number(count.value("rooster")) + "\n\n";

    out.flush();

    emit done();
}

/// формируем строку текстового прогресс-бара
QString TextRun::PbString( int pbWidth, float percent )
{

	if ( (percent < 0) || (percent>100) )
		{ return ""; }
	if ( (pbWidth < 0) || (pbWidth>300) )
		{ return ""; }

	QString start = "[";
	QString body = "|";
	if (falos)
	{
		start = "8";
		body = "=";
	}
	QString str = start;
	float percents_per_symbol = pbWidth / 100.0; // процентов на символ
	for( int i=0; i < pbWidth; i++ ) {
		if ( i < percents_per_symbol*percent) {
			str.append(body);
		} else {
			str.append(" ");
		}
	}
	if (falos)
		str.replace( percents_per_symbol*percent+1, 1, "o" );
	else
		str.append("]");
	return str;
}

void TextRun::setPbMode(bool pbMode, bool f)
{
	m_PbMode = pbMode;
	falos = f;
}
